home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / diskutil / lockkey.lzh / KEY.A68 < prev    next >
Encoding:
Text File  |  1989-07-16  |  19.5 KB  |  413 lines

  1. ******************************************************************************
  2. *                               LOCK & KEY                                   *
  3. *                            by Jesse Devine                                 *
  4. *                       (C) 1988 Antic Publishing Inc.                       *
  5. *                                                                            *
  6. *     Written 5/30/87 - 6/3/87 using A68, a public domain, and extremely     *
  7. *     cantankerous assembler.                                                *
  8. *                                                                            *
  9. ******************************************************************************
  10. ABS   BRA      SHRI
  11.       DC.L     $1B450D0A
  12.       DC.B     'Sorry, Bud. Youre not going to find the password this way.'
  13.       DC.W     $0D0A
  14.       DC.B     'Why dont you just go about your business and leave this'
  15.       DC.W     $0D0A
  16.       DC.B     'persons files alone. Keep your nose where it belongs.'
  17.       DC.L     $0D0A0D0A
  18.       DC.L     $0D0A0D0A
  19.       DC.L     $0D0AFFFF
  20. ****************************************
  21. *      ADJUST PROGRAM MEMORY USAGE     *
  22. ****************************************
  23. SHRI  MOVE.L   A7,A5           STORE USER STACK
  24.       LEA      USSTK,A7        GET ADDRESS OF NEW STACK
  25.       MOVE.L   4(A5),A5        GET BASE PAGE ADDRESS
  26.       MOVE.L   $C(A5),D0       GET LENGTH OF PROGRAM AREA
  27.       ADD.L    $14(A5),D0      ADD IN LENGTH OF INITIALIZED DATA
  28.       ADD.L    $1C(A5),D0      ADD IN LENGTH OF UNINITIALIZED DATA
  29.       ADD.L    #$100,D0        ADD IN 256 BYTES BASE PAGE
  30.       MOVE.L   D0,-(A7)        MOVE RESERVE LENGTH ONTO STACK
  31.       MOVE.L   A5,-(A7)        MOVE RESERVE ADDRESS ONTO STACK
  32.       MOVE.W   #0,-(A7)        DUMMY WORD VALUE
  33.       MOVE.W   #$4A,-(A7)      SETBLOCK FUNCTION NUMBER
  34.       TRAP     #1              CALL GEMDOS
  35.       ADD.L    #12,A7          FIX THE STACK
  36.       TST.L    D0              CHECK FOR ERROR
  37.       BNE      ERROR           IF SO, INDICATE GENERAL ERROR
  38. ****************************************
  39. *    A L L O C A T E   M E M O R Y     *
  40. ****************************************
  41.       MOVE.L   #$A00,-(A7)       ALLOCATE $A00 BYTES
  42.       MOVE.W   #$48,-(A7)        MALLOC FUNCTION NUMBER
  43.       TRAP     #1                CALL GEMDOS
  44.       ADDQ.L   #6,A7             FIX THE STACK
  45.       CMPI.L   #0,D0             CHECK FOR RETURN ERROR
  46.       BEQ      ERROR             IF SO, PRINT ERROR MESSAGE
  47.       MOVE.L   D0,BUFF
  48. ****************************************
  49. * U N S C R A M B L E  P A S S W O R D *
  50. ****************************************
  51.       LEA      PASS,A3           GET ADDRESS OF SCRAMBLED PASSWORD
  52. LP4   CMPI.B   #0,(A3)           CHECK FOR END OF PASSWORD
  53.       BEQ      DONE1             IF END, GO ON WITH OTHER STUFF
  54.       ADDI.B   #1,(A3)           SHIFT PASSWORD BACK INTO PLACE,
  55.       ADDI.L   #1,A3             INCREMENT PASSWORD POSITION,
  56.       BRA      LP4               AND CONTINUE WITH LOOP
  57. ****************************************
  58. *  U N S C R A M B L E   F O L D E R   *
  59. ****************************************
  60. DONE1 LEA      FOLD,A3           GET ADDRESS OF SCRAMBLED FOLDER
  61. LP5   CMPI.B   #0,(A3)           CHECK FOR END OF FOLDER NAME
  62.       BEQ      DONE2             IF END, GO ON WITH OTHER STUFF
  63.       ADDI.B   #1,(A3)           SHIFT FOLDER NAME BACK INTO PLACE,
  64.       ADDI.L   #1,A3             INCREMENT FOLDER POSITION,
  65.       BRA      LP5               AND CONTINUE WITH LOOP
  66. ****************************************
  67. *   D E T E R M I N E   D R I V E  #   *
  68. ****************************************
  69. DONE2 MOVE.W   #$19,-(A7)        CURRENT DRIVE FUNCTION #
  70.       TRAP     #1                CALL GEMDOS
  71.       ADDQ.L   #2,A7             FIX THE STACK
  72.       MOVE.W   D0,DRIVE
  73. ****************************************
  74. *   I N I T I Θ*
  75. *                                                                            
  76. *  ⇨S C R E E N  *
  77. ****************************************
  78.       LEA      INIT,A0           GET ADDRESS OF INI8B                                                                       ET L
  79.       BSR      PRT2              PRINT INIT STB                                                                       G
  80.       LEA      TIT⇧◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪GDRESS OF TITLE LINE
  81.       BSR      PRT1              PB                                                                       T TITLE LINEnt Y◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪GET ADDRESS OF YRIGHT LINE
  82.       BSR      PRTPRIRIGHT LINEn
  83.       BSR      SKIP              SKIP A LINE
  84. ****************************************
  85. *     C H E 
  86. R A S S W O R D      *
  87. ****************************************
  88.       LEA      PLEA◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪GDRESS OF PROMPT MER      PRT1              T IT
  89.       BSR      PROMP             GET PASSWORD FROM USER
  90.       MOVE.L   0,-(
  91. ADDRESS OF USER PASSWORD -> A4nt PASS,A3           ADDRESS OF INTER#/8> A3
  92. *
  93. LP3   CMPI.B   #0,(A3)           CHECK FOR END OF INTERNAL PASSWORD
  94.       BEQ      UPOIF EQUAL, USER PASSWORD IS OK
  95. *
  96. MPM.B   (A3)+,(A4)+       COMPARE MEMORY AND INCREMENT
  97.       BNE      UPBAD             IF NOT EQUAL, USER PASSWORD IS BAD
  98.       BRA      LP3               OTHERWISE, KEEP COMPAB                                                                       G
  99. *
  100. UPBAD BSR      SKIP              SKIR A LINE
  101.       BSR      SKIR              SKIR ANOTHER LINE
  102.       LEA      BAD◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪LOAD BAD /MESAGE ADDRESS
  103.       BSR      PRT              AND B                                                                       T IT
  104.       BRA      STOP              THEN END THE PROGRAM
  105. ****************************************
  106. *     DO THE HIDING OR THE SHOWING     *
  107. ****************************************
  108. UPOK  BSR      SKIP              SKIP A LINE
  109.       BSR      SKIP              SKIR ANOTHER ONEn
  110.       LEA      SEAR◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪GDRESS OF SEARCHING MEGE
  111.       BSR      PRT2              PBINT ITnt FOLD,A3           GET ADDRESS OF FOLDERnt WORK,A4                                                                               T ADDRESS OF WORKSPACE
  112.       MOVE.L   (A3)+,(A4)+       MOVE FIRST FOUR BYTES OF FOLDERNAME
  113.       MOVE.L   (A3)+,(A4)+       MOVE LAST FOUR BYTES OF FOLDERNAME
  114.       MOVE.B   #0,(A4)           END WITH A ZEROnt WORK,A0                                                                               T THE STARTING ADDRESS OF NEW LOCATION
  115.       BSR      PRT2              AND T ITnt PERD,A0           GET A PERIOD
  116. R      PRT2              T ITn
  117.       MOVE.L   A3◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪THEN GET ADDRESS OF EXTENSION
  118.       BSR      PRT1              AND PRINT THAT TOO
  119.       BSR      SKIR              THEN SKIR A LINE
  120. *
  121. MOVE.L   BUFF◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪T ADDRESS OF BUFFER
  122. R      RSEC              READ IN DIRECTORY SECTORS
  123.       MOVE.L   BUFF◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪T ADDRESS OF BUFFER
  124. BSR      RSEC              DO IT AGAIN FOR SAFETY
  125. *
  126.       MOVE.L   BUFF◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪T THE ADDRESS OF THE BUFFER AGAINnt FOLD,A1                                                                               T THE ADDRESS OF THE FOLDER NAME
  127.       BSR      MATCH             PERFORM PATTERN MATCH
  128.       TST.W    D0                CHECK FOR ERROR
  129.       BMI      STOP              IF SO, END THE PROGRAM
  130. *
  131.       ADD.L    #11,A1            MOVE TO FILE ATTRIBUTE BYTE
  132.       CMPI.B   #$02,(A1)         CHECK FOR HIDDEN FILE
  133.       BEQ      SHOW              BRANCH TO SHOW FOLDER ROUTINE
  134.       CMPI.B   #$10,(A1)         CHECK FOR FOLDER STATUS
  135.       BEQ      HIDE              BRANCH TO HIDE FOLDER ROUTINE
  136. *
  137.       LEA      OOPS◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪LOAD MESAGE FOR NEITHER
  138. BSR      PRTB                                                                       T MESAGE
  139.       BRA      STOP              END THE PROGRAM
  140. *
  141. SHOW  MOVE.B   #$10,(A1)         CHANGE THE ATTRIBUTE BYTE TO FOLDERn
  142.       MOVE.L   BUFF◆A0           RE-LOAD THE ADDRESS OF THE BUFFER
  143.       BSR      WSEC              WRITE DIRECTORY SECTORS BACK
  144.       BSR      FOOL              ALTER THE DISK'S SERIAL NUMBER
  145. LEA      M2,A0             LOAD ADDRESS OF UNLOCKED MESSAGE
  146. R      PRT              T UNLOCKED MESAGE
  147.       BRA      STOP              END THE PROGRAM
  148. *
  149. HIDE  MOVE.B   #$02,()         CHANGE THE ATTRIBUTE BYTE TO HIDDEN
  150.       MOVE.L   BUFF◆A0           RE-LOAD THE ADDRESS OF THE BUFFER
  151. BSR      WSEC              WRITE DIRECTORY SECTORS BACK
  152.       BSR      FOOL              ALTER THE DISK'S SERIAL NUMBER
  153.       LEA      M10◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪LOAD ADDRESS OF LOCKED MEGE
  154.       BSR      PRT1              B                                                                       T LOCKED MESAGE
  155. BRA      STOP              END THE PROGRAM
  156. ****************************************
  157. *        E N D R R O G R A M         *
  158. ****************************************
  159. STOP  LEA      DESK,A0           GET ADDRESS OF DESKTOP MESAGE
  160.       BSR      PRT1              B                                                                       T ITn
  161. *
  162. MOVE.L   BUFF◆D0                                                                               T ADDRESS OF MEMORY BUFFER
  163.       MOVE.L   D0,-(A7)          PUT THE ADDRESS ON THE STACK
  164.       MOVE.W   #$49,-(A7)        PUT FUNCTION #MFREE ON STACK
  165.       TRAP     #1                CALL GEMDOS TO DE-ALLOCATE MEMORY
  166.       ADDQ.L   #6,A7             AND FIX THE STACK
  167. *
  168.       MOVE.W   #1,-(A7)          CONIN TO PAUSE THE PROGRAM
  169.       TRAP     #1                CALL GEMDOS
  170.       ADDQ.L   #2,A7             AND FIX THE STACK
  171. *
  172.       CLR.L    -(A7)             END THE PROGRAM
  173.       TRAP     #1
  174. ****************************************
  175. *              D A T A                 *
  176. ****************************************
  177. TEMP3 DC.L     1
  178. INI  DC.L     $1B450000         ESC-E, TO CLEAR SCREEN
  179. DUM1  DS.L     1
  180. FOLD  DC.B     'ENKCDQ^0EKC',0
  181. PASS  DC.B     'O@RRVNQC',0
  182. Y  DC.B     '(C)1988 Antic Publishing, Inc.                   ',0
  183. TITLE DC.B     'Lock & Key - by Jesse Devine',0
  184. OOPS  DC.B     'That file is not a folder.',0
  185. BAD   DC.B     'Invalid Password. ',0
  186. M2    DC.B     'Folder Unlocked. ',0
  187. M10   DC.B     'Folder Locked. ',0
  188. DESK  DC.B     'Press any key to return to the desktop.',0
  189. PLEA  DC.B     'Please enter your password:',0
  190. SEAR  DC.B     'Searching for ',0
  191. DRIVE DS.W     1
  192. DUM2  DS.L     1
  193. WORK  DS.B     20
  194. PERD  DC.B     '.',0
  195. BUFF  DS.L     1
  196.       DS.L     256
  197. USSTK DS.L     1
  198. ****************************************
  199. *      W R I T E   S E 
  200.  T O R S       *
  201. ****************************************
  202. WSEC  MOVE.W   DRIVE,-(A7)       DRIVE NUMBER
  203.       MOVE.W   #10◆-(A7)         STARTING SECTOR NUMBER
  204. MOVE.W   #5,-(A7)          NUMBER OF SECTORS TO BE WRITTEN
  205.       MOVE.L   A0,-(A7)          SECTOR BUFFER ADDRESS
  206.       MOVE.W   #1,-(A7)          WRITE SECTOR FLAG
  207.       MOVE.W   #4,-(A7)          FUNCTION NUMBER
  208.       TRAP     #13               CALL RWABS
  209.       ADD.L    #14,A7            FIX THE STACK
  210.       RTS                        RETURN
  211. ****************************************
  212. *       R E A D   S E C T O R S        *
  213. ****************************************
  214. RSEC  MOVE.W   DRIVE,-(A7)       DRIVE NUMBER
  215.       MOVE.W   #10,-(A7)         STARTING SECTOR NUMBER
  216.       MOVE.W   #5,-(A7)          NUMBER OF SECTORS TO BE READ
  217.       MOVE.L   A0,-(A7)          SECTOR BUFFER ADDRESS
  218.       MOVE.W   #0,-(A7)          READ SECTOR FLAG
  219.       MOVE.W   #4,-(A7)          FUNCTION NUMBER
  220. TRAP     #13               CALL RWABS
  221.       ADD.L    #14,A7            FIX THE STACK
  222.       RTS                        RETURN
  223. ****************************************
  224. *  THIS FUNCTION FOOLS THE DESKTOP     *
  225. *  INTO THINKING THE DISK HAS BEEN     *
  226. *  CHANGED BY ALTERING THE SERIAL      *
  227. *  NUMBER IN THE BOO8ECTOR.          *
  228. ****************************************
  229. FOOL  MOVE.W   DRIVE,-(A7)       DRIVE NUMBER
  230.       MOVE.W   #0,-(A7)          STARTING SECTOR NUMBER
  231.       MOVE.W   #1,-(A7)          NUMBER OF SECTORS TO BE READ
  232. LEA      BUFF◆A0           GET ADDRESS OF BUFFER
  233.       MOVE.L   A0,-(A7)          SECTOR BUFFER ADDRESS
  234.       MOVE.W   #0,-(A7)          READ SECTOR FLAG
  235.       MOVE.W   #4,-(A7)          FUNCTION NUMBER
  236.       TRAP     #13               CALL RWABS
  237.       ADD.L    #14,A7            FIX THE STACK
  238. *
  239. LEA      BUFF◆A0           GET ADDRESS OF BUFFER
  240.       ADD.L    #10◆A0            MOVE TO SERIAL NUMBER
  241.       ADD.B    #128,(A0)         INCREMENT SERIAL NUMBER BY 128
  242. *
  243.       MOVE.W   DRIVE,-(A7)       DRIVE NUMBER
  244.       MOVE.W   #0,-(A7)          STARTING SECTOR NUMBER
  245.       MOVE.W   #1,-(A7)          NUMBER OF SECTORS TO BE WRITTEN
  246.       LEA      BUFF◆A0           GET ADDRESS OF BUFFER
  247.       MOVE.L   A0,-(A7)          SECTOR BUFFER ADDRESS
  248.       MOVE.W   #1,-(A7)          WRITE SECTOR FLAG
  249.       MOVE.W   #4,-(A7)          FUNCTION NUMBER
  250.       TRAP     #13               CALL RWABS
  251.       ADD.L    #14,A7            FIX THE STACK
  252.       RTS
  253. ****************************************
  254. *              M A T C H               *
  255. ****************************************
  256. MATCH MOVE.L   1,A3             A3 WILL BE ADDRESS OF INPUT
  257.       MOVE.L   A0,A0,-(
  258. A4 WILL BE ADDRESS OF BUFFER PATTERN
  259. *
  260.       MOVE.L   A4,A6             MOVE BUFFER ADDRESS TO A6
  261.       ADDI.L   #$1200,A6         THIS POINT IS THE END OF THE BUFFER
  262. *
  263. LP1   CMP.L    A4,A6             CHECK FOR END OF BUFFER
  264.       BEQ      FAIL              IF END, MATCHING STOPS
  265. *
  266. CMPM.B   (A3)+,(A4)+       COMPARE A3 WITH A4
  267.       BEQ      FOUND             IF SAME, BRANCH OUT OF LOOP
  268.       SUB.L    #1,A3             FIX ADDRESS OF INPUT STBING
  269.       BRA      LP1               OTHERWISE, KEEP TRYING
  270. *
  271. FOUND MOVE.L   A3,TEMP1
  272.       MOVE.L   A4,TEMP2
  273. *
  274. LP2   CMPI.B   #0,(A3)           CHECK FOR END OF FOLDER 8BING
  275.       BEQ      SUCC              IF EQUAL, MATCH IS SUCCESSFUL
  276. *
  277.       CMPM.B   (A3)+,(A4)+       COMPARE MEMORY AND INCREMENT
  278.       BNE      REDO              IF NOT EQUAL, MATCH FAILS
  279.       BRA      LP2               OTHERWISE, KEEP COMPAB                                                                       G
  280. *
  281. REDO  MOVE.L   TEMP1,A3          RESTORE ORIGINAL FOLDER POSITION
  282.       SUB.L    #1,A3             FIX IT'S ADDRESS
  283.       MOVE.L   TEMP2,A0          RESTORE BUFFER POSITION
  284.       BRA      LP1               GO ON WITH FIRST-CHARACTER 8EARCH
  285. *
  286. SUCC  MOVE.W   #0,D0             INDICATE SUCCESS IN D0
  287.       MOVE.L   TEMP2,A1          PUT PATTER# POSITION IN  FOR RETURN
  288.       SUB.L    #1,A1             FIX IT BY ONE
  289.       RTS                        AND RETURN
  290. *
  291. FAIL  LEA      MES3,A0                    GDRESS OF FAILURE MESSAGE
  292.       BSR      PRT              PBINT ITn
  293.       MOVE.W   #-1,D0            INDICATE FAILURE IN D0
  294.       RTS                        AND RETURN
  295. *
  296. TEMP1 DS.L     1                 STORAGE FOR ADDRESS OF INPUT 8BIGET L
  297. TEMP2 DS.L     1                 STORAGE FOR ADDRESS OF PATTERN
  298. MES3 DC.B     'Folder not present on this disk.',0
  299. ****************************************
  300. *           P R I N T   # 1            *
  301. ****************************************
  302. PRT1  MOVE.L   0,-(A7)
  303.       MOVE.W   #$09,-(A7)
  304.       TRAP     #1
  305.       ADD.L    #6,A7nt RET,A0
  306.       MOVE.L   A0,-(A7)
  307.       MOVE.W   #$09,-(A7)
  308.       TRAP     #1
  309.       ADD.L    #6,A7
  310.       RTS
  311. RET   DC.L     $0D0A0000
  312. ****************************************
  313. *           P R I N T   # 2            *
  314. ****************************************
  315. PRT2  MOVE.L   A0,-(A7)
  316.       MOVE.W   #$09,-(A7)
  317.       TRAP     #1
  318.       ADD.L    #6,A7
  319.       RTS
  320. ****************************************
  321. *           S K I P   L I N E          *
  322. ****************************************
  323. SKIP  LEA      BLANK,A0
  324.       BSR      PRT2
  325.       RTS
  326. BLANK DC.L     $0D0A0000
  327. ****************************************
  328. *              P R O M P T             *
  329. **************************************** 
  330. PROMP MOVE.W   #'>',-(A7)     PUT PROMPT ADDRESS ON STACK
  331.       MOVE.W   #2,-(A7)       CONOUT OPCODE
  332.       TRAP     #1             CALL GEMDOS
  333.       ADDQ.L   #4,A7          ADJUST STACK
  334. *
  335. LEA      INPUT,A3       GET THE ADDRESS OF INPUT BUFFER
  336. GET   MOVE.W   #$7,-(A7)      DIRECT CONIN FUNCTION NUMBER
  337.       TRAP     #1             CALL GEMDOS
  338.       ADDQ.L   #2,A7          FIX THE STACK
  339.       MOVE.B   D0,D1          TAKE ONLY ONE BYTE FROM D0
  340. *
  341.       CMPI.B   #8,D1          CHECK FOR BACKSPACE
  342.       BEQ      BACK           IF EQUAL, PERFORM BACKSPACE
  343. *
  344. MPI.B   #13,D1         CHECK FOR RETURN KEY
  345.       BEQ      NMORE          IF EQUAL, BRANCH TO NO MORE
  346. *
  347.       LEA      INPUT,A0       GET ORIGINAL BUFFER ADDRESS
  348.       ADDQ.L   #8,A4          MOVE TO THE END OF THE BUFFER
  349. MP.L    A3,A4          HECK TO SEE IF AT END OF BUFFER
  350.       BNE      STUFF          IF NOT, GO ON WITH OTHER STUFF
  351. *
  352.       BSR      BELL           SOUND THE BELL
  353.       BRA      GET            AND GO BACK TO THE MAIN LOOP
  354. *
  355. STUFF CMPI.B   #97,D1         CHECK FOR BOTTOM LOWERCASE THRESHOLD
  356.       BLT      FOCI           IF BELOW LOWERCASE, IGNORE
  357.       CMPI.B   #122,D1        CHECK FOR TOP OF LOWERCASE THRESHOLD
  358.       BGT      FOCI           IF ABOVE LOWERCASE, IGNORE
  359.       SUB.B    #32,D1         OTHERWISE, ADJUST LOWER TO UPPER
  360. *
  361. FOCI  MOVE.B   D1,(A3)        MOVE CHAR TO INPUT BUFFER
  362. ADDQ.L   #1,A3          AND INCREMENT BUFFER POSITION,
  363.       MOVE.W   #'*',-(A7)     THEN PUT ASTERISK ON STACK
  364.       MOVE.W   #2,-(A7)       PUT CONOUT FUNCTION NUMBER ON STACK
  365.       TRAP     #1             AND CALL GEMDOS
  366.       ADDQ.L   #4,A7
  367. *
  368.       BRA      GET            GET ANOTHER KEY
  369. ****************************************
  370. *  B A 
  371.  S R A C E    R O U T I N E  *
  372. ****************************************
  373. BACK  LEA      INPUT,A0       GET ORIGI# INPUT BUFFER ADDRESS
  374.       CMP.l    A3◆A4          HECK CURRENT POINTER AGAINST IT
  375.       BNE      REST           IF NOT EQUAL, DO THE REST OF ROUTINE
  376. *
  377. BSR      BELL           OTHERWISE, SOUND THE BELL
  378.       BRA      GET            THEN GO BACK TO MAIN LOOP
  379. *
  380. REST  LEA      SEQ◆⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪GDRESS OF BACKSPACE SEQUENCE
  381. R      PRT2           AND B                                                                       T IT
  382. *
  383. SUB.L    #1,A3          DECREMENT INPUT BUFFER POINTER
  384. BRA      GET            GO BACK TO MAIN LOOP
  385. ****************************************
  386. *     R E T U R N   R O U T I N E      *
  387. ****************************************
  388. NMORE MOVE.B   #0,(A3)        INSERT FINAL ZERO IN INPUT BUFFER
  389. LEA      INPUT,       MOVE THE BUFFER TO  FOR RETURN
  390.       RTS                     AND RETURN
  391. ****************************************
  392. INPUT DS.B     10
  393. SEQ   DC.L     $08200800
  394. ****************************************
  395. *        S O U N D   B E L L           *
  396. ****************************************
  397. BELL  MOVE.W   #7,-(A7)       PUT BELL CHARACTER ON STACK
  398.       MOVE.W   #2,-(A7)       PUT CONOUT FUNCTION NUMBER ON STACK
  399.       TRAP     #1             CALL GEMDOS
  400.       ADDQ.L   #4,A7          AND FIX THE STACK
  401.       RTS                     RETURN
  402. ****************************************
  403. *             E R R O R                *
  404. ****************************************
  405. ERROR LEA      MES,A0
  406.       BSR      PRT2
  407. *
  408. MOVE.W   #1,-(A7)
  409.       TRAP     #1
  410.       ADDQ.L   #2,A7n
  411. *
  412. BRA      STOP
  413. *
  414. MES  DC.B     'GENERAL ERROR. ',0
  415. ****************************************
  416.       END
  417.  
  418.